#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "include/vector.h"
#include "include/stack.h"

// 栈构造
void StackNew(Stack* s) {
    // 这里犯了错误，C和C++中，在局部变量中分配的内存， 函数结束之后就回收了
    // 应当从堆中分配内存
    Vector* v = malloc(sizeof(Vector));
    assert(v != NULL); 
    VectorNew(v); 
    s->v = v; 
}
// 压栈
void StackPush(Stack* s, int elem) {
    VectorAddLast(s->v, elem); 
} 
// 弹栈
int StackPop(Stack* s) {
    return VectorRemoveLast(s->v);
}
// 查看栈顶第一个元素
int StackPeek(Stack* s) {
    return VectorGetFirst(s->v);
} 
// 栈大小
int StackSize(Stack* s) {
    return VectorSize(s->v);
}
// 栈是否为空
int StackIsEmpty(Stack* s) {
    return VectorIsEmpty(s->v); 
}
// 栈打印
void StackString(Stack* s) {
    printf("Stack:");
    printf(" > [");
    for (int i = 0; i < StackSize(s); i++) {
        printf("%d", VectorGet(s->v, i));
        if (i != StackSize(s) - 1)
            printf(", ");
    }
    printf("] top\n"); 
}
// 栈析构
void StackDispose(Stack* s) {
    if (s->v) {
        VectorDispose(s->v);  // 释放 v 申请的内存
        free(s->v);  // 释放 v 本身在堆上的内存
    }
}